﻿/**
*    @file:    httpservice.cpp
*    @brief:
*    @author:  sanshi522@163.com
*    @date:    2024-12-23  16:27
*/
#include "httprouter.h"
#include "authorizationguard.h"
#include "responesutils.h"
#include <QDateTime>

HttpRouter::HttpRouter(QObject *parent)
    : HttpRequestHandler(parent)
{
    qDebug() << __FUNCTION__;
    authorizeGuard = false;
}

HttpRouter::~HttpRouter()
{
    qDeleteAll(m_requestMap);
    m_requestMap.clear();
    qDebug() << __FUNCTION__;
}

void HttpRouter::service(HttpRequest &request, HttpResponse &response)
{
    // 设置 CORS 响应头
    response.setHeader("Access-Control-Allow-Origin", "*");         // 允许所有来源（域名）访问该资源，实现跨域资源共享（CORS）
    response.setHeader("Access-Control-Allow-Credentials", "true"); // 允许跨域请求携带凭据（如 cookies、HTTP 认证等）
    response.setHeader("P3P", "CP=CAO PSA OUR");                    // P3P 是一种隐私策略头，用于声明网站的隐私政策，某些浏览器（如 IE）曾用此来处理第三方 Cookie

    // 如果请求中包含 Access-Control-Request-Method（说明是预检请求 preflight）且方法为 OPTIONS，则返回对应的 CORS 相关响应头
    if (!request.getHeader("Access-Control-Request-Method").isNull() && request.getMethod() == "OPTIONS")
    {
        response.setHeader("Access-Control-Allow-Methods", "POST,GET,TRACE,OPTIONS");     // 允许的 HTTP 方法（客户端可以使用的请求方式）
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,Origin,Accept"); // 允许的请求头字段，客户端可以在请求中使用这些头部字段
        response.setHeader("Access-Control-Max-Age", 86400);                              // 预检请求缓存时间（单位：秒），告诉浏览器在该时间内不需要重复发送 OPTIONS 请求
        //        response.setStatus(200);
        //        response.flush();
        //        return;
    }

    response.setHeader("Content-Type", "application/json;charset=utf-8");                              // 设置响应内容类型为 JSON 格式，并指定字符编码为 UTF-8
    response.setHeader("Date", QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss").toUtf8()); // 设置响应头中的 Date 字段，表示响应生成的时间
    QString path = request.getPath();
    QStringList pathList = path.split("/", Qt::SkipEmptyParts); // 自动跳过空元素

    // 因为path以 / 为开头，使用split，第一个元素为空串
    if (pathList.isEmpty() || pathList.first() != "api")
    {
        return returnError(response);
    }

    pathList.removeFirst(); // 移除 api

    if (authorizeGuard && !AuthorizationGuard::getInstance().isAuthorised())
    {
        return ResponesUtils::erroResponse(response, "服务端未授权！请联系 17633603876 ");
    }

    if (pathList.isEmpty())
    {
        return returnError(response);
    }

    QString controllerName = pathList.first();
    pathList.removeFirst(); //移除一级路由

    if (m_requestMap.find(controllerName) != m_requestMap.end())
    {
        return m_requestMap.value(controllerName)->route(pathList.join('/'), request.getMethod(), request, response);
    }
    else
    {
        return this->returnError(response);
    }
}

void HttpRouter::installController(QString path, HttpController *httpController)
{
    m_requestMap.insert(path, httpController);
}

bool HttpRouter::getAuthorizeGuard() const
{
    return authorizeGuard;
}

void HttpRouter::setAuthorizeGuard(bool value)
{
    authorizeGuard = value;
}
